package com.vwa.BluetoothCalculate.Controller;

import com.fazecast.jSerialComm.SerialPort;

public class ReadCom {
    private static SerialPort serialPort;

    public static void main(String[] args) {
        SerialPort serialPort = connectCom("COM6");
        if (serialPort != null) {
            String numbers = numbers(serialPort);
            System.out.println(numbers);
        }

    }

    /**
     * 连接串口
     *
     * @param comName 串口的名称  COM6
     */
    public static SerialPort connectCom(String comName) {

        int i = 3;
        while (i > 0) {
            // 打开COM6串口
            serialPort = SerialPort.getCommPort(comName);
            if (serialPort.openPort()) {
                System.out.println("Port is open!");
                // 设置串口参数（可选，根据实际需求设置）
                serialPort.setBaudRate(9600); // 设置波特率
                serialPort.setNumDataBits(8); // 设置数据位
                serialPort.setNumStopBits(SerialPort.ONE_STOP_BIT); // 设置停止位
                serialPort.setParity(SerialPort.NO_PARITY); // 设置校验位

                break;
            } else {
                System.out.println("Unable to open the port.");
            }
            i--;
        }
        return serialPort;
    }

    /**
     * 发送指令，读取返回的数据
     *
     * @param serialPort 连接的串口对象
     * @return 数据
     */
    public static String numbers(SerialPort serialPort) {
        String formattedResult = null;

        try {
            // 准备要发送的指令
            byte[] query_command = new byte[]{0x01, 0x03, 0x00, 0x00, 0x00, 0x0D, (byte) 0x84, (byte) 0x0F};

            //指令写入设备中
            serialPort.writeBytes(query_command, 8);

            //准备接收数据容器，每31个为一组
            byte[] response = new byte[31];

            //缓冲100毫秒，给设备传输事件
            Thread.sleep(100);

            //将设备返回的数据放入到容器中
            int numRead = serialPort.readBytes(response, response.length);

            //解析数据
            for (byte b : response) {
                System.out.print(b + " ");
            }
            System.out.println(" ");

            //判断位用来判断拉力是在哪个区间，0到8 、 8到32 、 32到128
            byte optionType = response[3];

            byte open = response[0];

            //数据位转为16进制
            String s1 = ReadCom.byte2Str(response[4]);
            String s2 = ReadCom.byte2Str(response[5]);
            String s3 = ReadCom.byte2Str(response[6]);

            //拼接位16位
            String numberAll = s1 + s2 + s3;

            //用于判断增长比例
            int check = Integer.parseInt(s1, 16);

            //判断数据是否有用（有返回全是0的情况）
            if (open != 0) {

                //判断对结果赋值，大范围为2到8
                if (optionType == 64) {

                    //2到4的情况
                    if (check < 128) {

                        //实际值对应的16进制： 2 - 00 ； 3 - 40 ； 4 - 80
                        double i = 2 + 2.00 * Integer.parseInt(numberAll, 16) / 8388608;
                        //拉力值
                        formattedResult = String.format("%.2f", i);
                    } else {//4到8的情况

                        //实际值对应的16进制： 5 - A0 ； 6 - C0 ； 7 - E0
                        double i = 4 + 4.00 * (Integer.parseInt(numberAll, 16) - 8388607) / 8388608;
                        //拉力值
                        formattedResult = String.format("%.2f", i);
                    }

                } else if (optionType == 65) {

                    //8到16的情况
                    if (check < 128) {

                        //实际值对应的16进制： 8 - 00 ； 10 - 20 ； 12 - 40 ；  14 - 60 ； 16 - 80
                        double i = 8 + 8.00 * Integer.parseInt(numberAll, 16) / 8388608;
                        //拉力值
                        formattedResult = String.format("%.2f", i);
                    } else { //16到32的情况

                        //实际值对应的16进制： 18 - 90 ； 20 - A0 ； 22 - B0 ；  24 - C0 ； 26 - D0  ； 28 - E0 ； 30 - F0
                        double i = 16 + 16.00 * (Integer.parseInt(numberAll, 16) - 8388607) / 8388608;
                        //拉力值
                        formattedResult = String.format("%.2f", i);
                    }

                } else if (optionType == 66) {

                    //32到64的情况
                    if (check < 128) {

                        //实际值对应的16进制： 32 - 00 ； 10 - 20 ； 12 - 40 ；  14 - 60 ； 16 - 80
                        double i = 32 + 32.00 * Integer.parseInt(numberAll, 16) / 8388608;
                        //拉力值
                        formattedResult = String.format("%.2f", i);
                    } else {//64到128的情况

                        //实际值对应的16进制： 32 - 00 ； 10 - 20 ； 12 - 40 ；  14 - 60 ； 16 - 80
                        double i = 64 + 64.00 * (Integer.parseInt(numberAll, 16) - 8388607) / 8388608;
                        //拉力值
                        formattedResult = String.format("%.2f", i);
                    }

                } else if (optionType == 0) {//0的情况
                    formattedResult = String.format("%.2f", 0.00);

                }
            }
        } catch (NumberFormatException | InterruptedException e) {
            System.out.print("NumberFormatException");
        }
        return formattedResult;
    }

    public static String byte2Str(byte b) {
        //转为16位字符串
        String number1 = Integer.toHexString(b & 0xFF);

        //System.out.println(number1);
        //判断字符串的位数
        if (number1.length() == 2) {
            return number1;
        } else {
            return "0" + number1;
        }
    }


}
